#include "FAT32_functions.h"
#include "interfaz_fuse.h"
#include "protocolo_NIPC.h"
#include "archivo_Configuracion.h"
#include "consola_FS.h"
#include "cache.h"
key_t claveSem;
static struct fuse_operations FS_funciones = {

.create = FS_create,
.open = FS_open,
.read = FS_read,
.write = FS_write,
.flush = FS_flush,
.release = FS_release,
.truncate = FS_truncate,
//.ftruncate = FS_truncate,
.unlink = FS_unlink,
.mkdir = FS_mkdir,
.readdir = FS_readdir,
.rmdir = FS_rmdir,
//.fgetattr = FS_fgetattr,
.getattr = FS_getattr,
.rename = FS_rename,

};
void inicializar();

void inicializar(void){
	leer_Boot_Sector();
	bajar_datos_Cluster_FAT();

	abrirConfig();

	int conexiones;

	struct sockaddr_in data;
	data.sin_family = AF_INET;
	data.sin_addr.s_addr = inet_addr(ip);
	data.sin_port = htons((puerto));
	int sock = 0;

	iniciarSocket(&sock);

	conectarSocket(&sock,data);

	char buffHandShake[1024];
	memset(buffHandShake,0,1024);
	char op=0; uint16_t res=1;

	memcpy(buffHandShake,&op,sizeof(uint8_t));
	memcpy(buffHandShake+sizeof(uint8_t),&op,sizeof(uint16_t));

	enviarDatos(buffHandShake,3,sock);

	memset(buffHandShake,0,1024);

	recibirDatos(buffHandShake,sock);
	
	memcpy(&res,buffHandShake+sizeof(uint8_t),sizeof(uint16_t));

	if(res==0){

		printf("hand existoso\n");

		vectorSocket=malloc(sizeof(int)*cantConexiones);

		for(conexiones=0;conexiones<cantConexiones;conexiones++){
			sock=0;
			iniciarSocket(&sock);
			conectarSocket(&sock,data);
			vectorSocket[conexiones]=sock;

 		}
		maxConec=0;
		claveSem=ftok("/bin/ls",76);
		semSock=inicia(cantConexiones, claveSem);
		claveSem=ftok("/bin/ls",76);
		mutexSock=inicia(1, claveSem);

	}
	claveSem=ftok("/bin/ls",76);
	mutexFAT=inicia(1, claveSem);
	return ;
}




int main(int argc,char* argv[]){

	inicializar();
	cachePrincipal();
	system("sudo umount /tmp/fuse");

	int argc_fuse = 3;
	char *argv_fuse[] = {"NULL", "/tmp/fuse" , "-d"};

    fuse_main(argc_fuse,argv_fuse,&FS_funciones,NULL);
    consola ();
	return 0;
}
